package main

import "fmt"

// 接口是一种类型

type cat struct {
}
type dog struct {
}

// 定义接口
type speaker interface {
	speak() // 接口里有speak()方法
}

// 给 cat 和 dog 绑定 speak()方法
func (c cat) speak() {
	fmt.Println("喵喵喵~")
}

func (d dog) speak() {
	fmt.Println("汪汪汪~")
}

// 传入接口
func da(s speaker) {
	// 接收参数,传进来什么就打什么
	s.speak()
}

func main() {
	var c1 cat
	var d1 dog
	// 传入什么就打印什么
	da(c1)
	da(d1)

	var ss speaker
	// cat实现了speaker 的所有方法,所以可以这样写
	ss = c1
	// 这样也会打印 喵喵喵~
	ss.speak()
}
